/*
 * @lc app=leetcode.cn id=10 lang=golang
 *
 * [10] 正则表达式匹配
 */

// @lc code=start
func isMatch(s string, p string) bool {
	var slen, plen int = len(s), len(p)
	if plen == 0 {
		return slen == 0
	}
	var pi, si int
	if slen > 0 {
		var ch uint8
		for ; pi < plen && si < slen; pi++ {
			if p[pi] == '.' {
				ch = s[si]
			} else {
				ch = p[pi]
			}
			if pi+1 < plen && p[pi+1] == '*' {
				// 重复
				pi++
				for ; si < slen && s[si] == ch; si++ {
				}
				if si >= slen {
					pi++
					break
				}
			} else {
				if s[si] != ch {
					return false
				} else {
					si++
				}
			}
		}
	}
	// p未消耗完
	if pi < plen {
		f := false
		for ; pi < plen; pi++ {
			if p[pi] != '*' {
				if f {
					return false
				}
				f = true
			} else {
				f = false
			}
		}
		if f {
			return false
		}
	}
	if si < slen {
		return false
	}
	return true
}

// @lc code=end

